package ar.uba.is2.tr.impl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.log4j.Logger;

import ar.uba.is2.common.mensaje.Mensaje;
import ar.uba.is2.tr.ComunicadorECDao;

/**
 * {@link ComunicadorECDao}
 * 
 * @author ger
 * 
 */
public class ComunicadorECDaoImpl implements ComunicadorECDao {

	private Logger log = Logger.getLogger(ComunicadorECDaoImpl.class);

	private static final long tiempoDeEsperaParaLectura = 5000;

	private static final String nombreArchivoComunicacionEC_TR = "EC_TR.txt";

	private static final String nombreArchivoComunicacionTR_EC = "TR_EC.txt";

	private static final String CODIGO_ACK = "ACK";

	/**
	 * {@inheritDoc}
	 */
	public void enviar(Mensaje mensaje) {
		File archivo = new File("../" + nombreArchivoComunicacionTR_EC);

		FileWriter writer = null;
		try {
			writer = new FileWriter(archivo, true);
			writer.write(mensaje.toString() + "\n");
		} catch (IOException e) {
			log.error("No se puedo escribir el mensaje que se envia a la EC.", e);

		} finally {
			if (writer != null)
				try {
					writer.close();
				} catch (Exception e2) {
					log.error("No se pudo cerrar el writer del archivo TR_EC");
				}
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public void borrarArchivoTR_EC() {
		File archivo = new File("../" + nombreArchivoComunicacionTR_EC);
		if (archivo.exists()) {
			archivo.delete();
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public void borrarArchivoEC_TR() {
		File archivo = new File("../" + nombreArchivoComunicacionEC_TR);
		if (archivo.exists()) {
			archivo.delete();
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public synchronized boolean verificarACK(int nroMensaje) {
		System.out.println("Verifico si llego el ACK");
		try {
			wait(tiempoDeEsperaParaLectura);
		} catch (InterruptedException e) {
			log.error("No pudo esperar el tiempo de timeout para intentar leer el mensaje.");
		}
		File archivo = new File("../" + nombreArchivoComunicacionEC_TR);
		if (!archivo.exists()) {
			log.debug("el archivo: " + archivo.getAbsolutePath() + " no existe");
			return false;
		}


		BufferedReader lector = null;
		boolean llego = false;
		try {
			lector = new BufferedReader(new FileReader(archivo));
			String ack;
			do {
				ack = lector.readLine();
				llego = (CODIGO_ACK + " " + nroMensaje).equals(ack);
			} while (ack != null && !llego);

		} catch (Exception e) {
			log.error("Hubo un error al intentar leer el mensaje que deja la EC con el ACK.", e);
		}

		return llego;
	}

}
